#ifndef _AI_H_
#define _AI_H_

#include "simulation.h"

////////////////////////////////////////////////////////////////////////////////

class DumbAI: public AI
{
  public:
  void think(const AIData& data, MicrobeOrder* order[SIM_MAX_MICROBES],
    int dM, float dT);
};

////////////////////////////////////////////////////////////////////////////////

enum ExampleAIStateType
{
  EXAMPLE_STATE_NORMAL,
  EXAMPLE_STATE_AVOID_WALL
};

struct ExampleAIState
{
  ExampleAIStateType type;
  float angle;
};

class ExampleAI: public AI
{
  public:
  ExampleAI();
  
  void think(const AIData& data, MicrobeOrder* order[SIM_MAX_MICROBES],
    int dM, float dT);
  
  private:
  void transitionState(const AIData& data);
  void executeState(const AIData& data, MicrobeOrder* order[SIM_MAX_MICROBES]);
  
  ExampleAIState state;
};

////////////////////////////////////////////////////////////////////////////////

class SmokeyAI: public AI
{
  public:
  SmokeyAI();
  
  void think(const AIData& data, MicrobeOrder* order[SIM_MAX_MICROBES],
    int dM, float dT);
  void thinkSpeedy(const AIData& data, MicrobeOrder* order, float dT);
  
  private:
  bool right;
  float time;
};

////////////////////////////////////////////////////////////////////////////////

enum ChrisAIStateType
{
  CHRIS_STATE_NORMAL
};

struct ChrisAIState
{
  ChrisAIStateType type;
  float angle;
};

class ChrisAI: public AI
{
  public:
  ChrisAI();
  
  void think(const AIData& data, MicrobeOrder* order[SIM_MAX_MICROBES],
    int dM, float dT);
  
  private:
  void transitionState(const AIData& data);
  void executeState(const AIData& data, const Microbe* microbe,
    MicrobeOrder* order);
  
  ChrisAIState state;
};

#endif
